aboutsummaryrefslogtreecommitdiff
path: root/src/routes/leaderboards/[name]/+page.svelte
blob: cfb73112a91700dd2ec5bc0acd8c11a011e539ae (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
<script lang="ts">
	import Header from '$lib/Header.svelte'
	import Head from '$lib/Head.svelte'
	import { skyblockItemToUrl } from '$lib/minecraft/inventory'
	import { cleanId, formatNumberFromUnit, toTitleCase } from '$lib/utils'
	import Username from '$lib/minecraft/Username.svelte'
	import type { MemberLeaderboard, ProfileLeaderboard } from '$lib/APITypes'

	export let data: MemberLeaderboard | ProfileLeaderboard

	$: imageUrl = data.name.startsWith('collection_') ? skyblockItemToUrl(data.name.slice(11)) : null
</script>

<Head title={`${cleanId(data.name)} - SkyBlock Leaderboards`} />
<Header backArrowHref="/leaderboards" />

<main>
	<h1>
		{#if imageUrl}
			<img src={imageUrl} alt={cleanId(data.name.slice(11))} />
		{/if}
		{toTitleCase(cleanId(data.name))} Leaderboard
	</h1>
	{#if data.info}
		<p class="leaderboard-info">
			<span class="leaderboard-info-icon">ⓘ</span>
			<span class="leaderboard-info-content">{@html data.info}</span>
		</p>
	{/if}

	<ol class="leaderboard-profile-list">
		{#each data.list as leaderboardItem, i}
			<li
				value={i > 0 && leaderboardItem.value === data.list[i - 1].value
					? data.list.map(i => i.value).indexOf(leaderboardItem.value) + 1
					: i + 1}
			>
				<span>
					{formatNumberFromUnit(
						leaderboardItem.value,
						data.unit ?? cleanId(data.name).toLowerCase()
					)}
				</span>
				{#if 'player' in leaderboardItem}
					<Username
						player={leaderboardItem.player}
						headType="2d"
						hyperlinkToProfile={leaderboardItem.profileUuid}
					/>
				{:else if leaderboardItem.players}
					{#each leaderboardItem.players as player}
						<span class="leaderboard-profile-player">
							<Username {player} headType="2d" hyperlinkToProfile />
						</span>
					{/each}
				{:else}
					Unknown player
				{/if}
			</li>
		{/each}
	</ol>
</main>

<style>
	h1 > img {
		height: 1em;
		vertical-align: text-top;
	}

	.leaderboard-profile-player {
		margin-right: 0.5em;
	}

	.leaderboard-info {
		background-color: var(--theme-lighter-background);
		padding: 0.5em 0.7em;
		border-radius: 0.5rem;
		width: fit-content;

		box-shadow: 0 0 1em rgba(0, 0, 0, 0.2);
	}
	.leaderboard-info-content {
		font-style: italic;
	}

	.leaderboard-profile-list {
		width: fit-content;
	}
</style>